﻿Imports System.Data.SqlClient
Imports System.IO
Imports Sendkey = System.Windows.Forms.SendKeys
'Imports System.Threading

Public Class FrmParametros

#Region "Variables"

    Private cGeneral As New clsGeneral
    Private cParametros As New clsParametros
    Private cProcuradores As New clsProcuradores

    Dim dtParametros As New DataTable()
    Dim dtProcuradorGeneral As New DataTable()
    Dim dtSubProcuradorGeneral As New DataTable()
    Dim NuevaFila As DataRow

#End Region

#Region "Eventos"

    Private Sub FrmParametros_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        gs_Pantalla = Me.Name

        dtProcuradorGeneral = cProcuradores.ObtenerProcuradores("Alfabetico", "Todos")
        Cmb_ProcuradorGeneral.DataSource = dtProcuradorGeneral
        Cmb_ProcuradorGeneral.ValueMember = dtProcuradorGeneral.Columns(0).ToString
        Cmb_ProcuradorGeneral.DisplayMember = dtProcuradorGeneral.Columns(1).ToString

        dtSubProcuradorGeneral = cProcuradores.ObtenerProcuradores("Alfabetico", "Todos")
        Cmb_SubProcuradorGeneral.DataSource = dtSubProcuradorGeneral
        Cmb_SubProcuradorGeneral.ValueMember = dtSubProcuradorGeneral.Columns(0).ToString
        Cmb_SubProcuradorGeneral.DisplayMember = dtSubProcuradorGeneral.Columns(1).ToString

        dtParametros.Clear()
        dtParametros = cParametros.ObtenerParametros()  ' se asume que hay un único registro en la tabla
        If dtParametros.Rows.Count > 0 Then
            Despliega()
        Else
            Limpiar()
        End If

    End Sub

    Private Sub Guardar_Click(sender As Object, e As EventArgs) Handles Guardar.Click
        If DirectCast(Cmb_ProcuradorGeneral.SelectedItem, DataRowView).Item("Estado") = "Inactivo" Then
            MessageBox.Show("Error. Procurador inactivo NO puede ser seleccionado como Procurador General")
            Cmb_ProcuradorGeneral.Focus()
            Exit Sub
        End If
        If DirectCast(Cmb_SubProcuradorGeneral.SelectedItem, DataRowView).Item("Estado") = "Inactivo" Then
            MessageBox.Show("Error. Procurador inactivo NO puede ser seleccionado como SubProcurador General")
            Cmb_SubProcuradorGeneral.Focus()
            Exit Sub
        End If

        If Cmb_ProcuradorGeneral.SelectedValue = Cmb_SubProcuradorGeneral.SelectedValue Then
            MessageBox.Show("Error - Procuradores Generales NO pueden ser el mismo")
            Cmb_ProcuradorGeneral.Focus()
        ElseIf Txt_Horas_Impresion.Text.Trim = "" Then
            MessageBox.Show("Error - Horas de Impresión no puede quedar vacía")
            Txt_Horas_Impresion.Focus()
        ElseIf Txt_Tasa_Anual_Costas.Text.Trim = "" Then
            MessageBox.Show("Error - Tasa Anual no puede quedar vacía")
            Txt_Tasa_Anual_Costas.Focus()
        ElseIf CDec(Txt_Tasa_Anual_Costas.Text.Trim) <= 0 Then
            MessageBox.Show("Error - Tasa Anual no puede ser cero ni negativa")
            Txt_Tasa_Anual_Costas.Focus()
        ElseIf Txt_Ruta_Servidor_Docs.Text.Trim = "" Then
            MessageBox.Show("Error - Ruta de Servidor no puede quedar vacía")
            Txt_Ruta_Servidor_Docs.Focus()
        ElseIf Microsoft.VisualBasic.Left(Txt_Ruta_Servidor_Docs.Text, 1) <> "\" _
        Or Microsoft.VisualBasic.Right(Txt_Ruta_Servidor_Docs.Text, 1) <> "\" Then
            MessageBox.Show("Error - NO corresponde a una ruta de red (\\maquina\carpeta_1\carpeta_2\)")
            Txt_Ruta_Servidor_Docs.Focus()
        ElseIf Txt_Exped_Entrega_Inmediata.Text.Trim = "" Then
            MessageBox.Show("Error - Expedientes de Entrega Inmediata no puede quedar vacío")
            Txt_Exped_Entrega_Inmediata.Focus()
        Else
            ' carga valores del objeto
            If dtParametros.Rows.Count = 0 Then
                cParametros.Codigo = -1     ' para facilitar posicionamiento en DataTable luego de Incluir en cParametros.Guardar()
            Else
                cParametros.Codigo = 1      ' se asigna sólo por formalidad, pero ya contiene dicho valor
            End If
            cParametros.CodigoProcurador = Cmb_ProcuradorGeneral.SelectedValue
            cParametros.CodigoSubProcurador = Cmb_SubProcuradorGeneral.SelectedValue
            cParametros.Horas_Impr_Recepcion = Txt_Horas_Impresion.Text
            cParametros.Tasa_Anual_Costas = Txt_Tasa_Anual_Costas.Text
            cParametros.Ruta_Serv_Doc = Txt_Ruta_Servidor_Docs.Text
            cParametros.Expedientes_Etica = Txt_Exped_Entrega_Inmediata.Text
            ' carga valores para Auditoría
            cParametros.Aplicacion = gs_Sistema_Nombre
            cParametros.Pantalla = gs_Pantalla
            cParametros.Usuario = gs_Usuario
            cParametros.Maquina = gs_Maquina
            cParametros.Guardar()    ' cParametros.EstadoGuardar contiene el Id insertado o modificado
            If cParametros.EstadoGuardar = -1 Then   ' -1 = Error
                ' cParametros.Guardar() despliega el mensaje de error
            Else
                ' Determina si los valores a almacenar ya existen o no
                If cParametros.Codigo = -1 Then      ' -1 = Incluir
                    cParametros.Codigo = cParametros.EstadoGuardar
                End If
                dtParametros.Clear()
                dtParametros = cParametros.ObtenerParametros()
                ' se asume que hay un único registro en la tabla así que se despliega directamente
                Despliega()
            End If
        End If
    End Sub

    Private Sub Imprimir_Click(sender As Object, e As EventArgs) Handles Imprimir.Click
        'Dim dt_RPT As New DataTable("Resultados")
        'Dim NuevaFila As DataRow
        'Dim CrReport As New CrystalDecisions.CrystalReports.Engine.ReportDocument

        If dtParametros.Rows.Count > 0 Then
            Try
                '    dt_RPT.Columns.Add("Codigo")
                '    dt_RPT.Columns.Add("Descripcion")
                '    dt_RPT.Columns.Add("Titulo_Reporte")
                '    For Fila As Integer = 0 To ds.Tables("Resultados").Rows.Count - 1
                '        NuevaFila = dt_RPT.NewRow()
                '        NuevaFila("Codigo") = ds.Tables("Resultados").Rows(Fila).Item("ID_Contexto")
                '        NuevaFila("Descripcion") = ds.Tables("Resultados").Rows(Fila).Item("Nom_Contexto")
                '        NuevaFila("Titulo_Reporte") = "Reporte de Contextos"
                '        dt_RPT.Rows.Add(NuevaFila)
                '    Next

                '    CrReport = New CrystalDecisions.CrystalReports.Engine.ReportDocument()

                '    CrReport.Load(gs_RutaReportes & "RptCatalogos.rpt")

                '    CrReport.SetDataSource(dt_RPT)
                '    Frm_RPT_Visor.CrystalReportViewer1.ReportSource = CrReport
                '    Frm_RPT_Visor.Show()

            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        Else
            MessageBox.Show("No hay datos para imprimir")
        End If
    End Sub

    Private Sub Excel_Click(sender As Object, e As EventArgs) Handles Excel.Click
        If dtParametros.Rows.Count > 0 Then
            cGeneral.DataTable_a_Excel(dtParametros, BarraProgreso)
        Else
            MessageBox.Show("No hay datos para exportar")
        End If
    End Sub

    Private Sub Cmb_ProcuradorGeneral_SelectedIndexChanged(sender As Object, e As EventArgs) Handles Cmb_ProcuradorGeneral.SelectedIndexChanged
        If DirectCast(Cmb_ProcuradorGeneral.SelectedItem, DataRowView).Item("Estado") = "Inactivo" Then
            MessageBox.Show("Error. Procurador inactivo NO puede ser seleccionado como Procurador General")
        End If
    End Sub

    Private Sub Cmb_SubProcuradorGeneral_SelectedIndexChanged(sender As Object, e As EventArgs) Handles Cmb_SubProcuradorGeneral.SelectedIndexChanged
        If DirectCast(Cmb_SubProcuradorGeneral.SelectedItem, DataRowView).Item("Estado") = "Inactivo" Then
            MessageBox.Show("Error. Procurador inactivo NO puede ser seleccionado como SubProcurador General")
        End If
    End Sub

    Private Sub Txt_Horas_Impresion_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Txt_Horas_Impresion.KeyPress
        If Asc(e.KeyChar) = Keys.Return Then
            Sendkey.Send("{tab}")
        ElseIf Asc(e.KeyChar) <> 8 Then
            If InStr("0123456789:,", Char.ToUpper(e.KeyChar)) = 0 Then
                MessageBox.Show("Caracter inválido, use dígitos, dos puntos y coma")
                e.Handled = True
            End If
        End If
    End Sub

    Private Sub Txt_Horas_Impresion_Validating(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles Txt_Horas_Impresion.Validating
        If Txt_Horas_Impresion.Text.Trim = "" Then
            MessageBox.Show("Error - Horas de Impresión no puede quedar vacía")
            e.Cancel = True
        End If
    End Sub

    Private Sub Txt_Horas_Impresion_LostFocus(sender As Object, e As EventArgs) Handles Txt_Horas_Impresion.LostFocus
        ' delimita la hilera con comas
        If Txt_Horas_Impresion.Text.Chars(0) <> "," Then
            Txt_Horas_Impresion.Text = "," & Txt_Horas_Impresion.Text.Trim
        End If
        If Txt_Horas_Impresion.Text.Chars(Txt_Horas_Impresion.TextLength - 1) <> "," Then
            Txt_Horas_Impresion.Text = Txt_Horas_Impresion.Text.Trim & ","
        End If
    End Sub

    Private Sub Txt_Tasa_Anual_Costas_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Txt_Tasa_Anual_Costas.KeyPress
        If Asc(e.KeyChar) = Keys.Return Then
            Sendkey.Send("{tab}")
        ElseIf Asc(e.KeyChar) <> 8 Then
            If InStr("0123456789.", Char.ToUpper(e.KeyChar)) = 0 Then
                MessageBox.Show("Caracter inválido, use dígitos y punto decimal")
                e.Handled = True
            End If
        End If
    End Sub

    Private Sub Txt_Tasa_Anual_Costas_LostFocus(sender As Object, e As EventArgs) Handles Txt_Tasa_Anual_Costas.LostFocus
        Txt_Tasa_Anual_Costas.Text = Format(CDec(Txt_Tasa_Anual_Costas.Text), "#0.00")
    End Sub

    Private Sub Txt_Tasa_Anual_Costas_Validating(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles Txt_Tasa_Anual_Costas.Validating
        Dim Contador_Puntos As Integer

        If Txt_Tasa_Anual_Costas.Text.Trim = "" Then
            MessageBox.Show("Error - Tasa Anual no puede quedar vacía")
            e.Cancel = True
        ElseIf CDec(Txt_Tasa_Anual_Costas.Text.Trim) <= 0 Then
            MessageBox.Show("Error - Tasa Anual no puede ser cero ni negativa")
            e.Cancel = True
        Else
            Contador_Puntos = 0
            For i As Integer = 0 To Txt_Tasa_Anual_Costas.TextLength - 1
                If Txt_Tasa_Anual_Costas.Text.Chars(i) = "." Then
                    Contador_Puntos = Contador_Puntos + 1
                End If
            Next
            If Contador_Puntos > 1 Then
                MessageBox.Show("Error - NO puede haber más de un punto decimal")
                e.Cancel = True
            End If
        End If
    End Sub

    Private Sub Txt_Ruta_Servidor_Docs_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Txt_Ruta_Servidor_Docs.KeyPress
        If Asc(e.KeyChar) = Keys.Return Then
            Sendkey.Send("{tab}")
        ElseIf Asc(e.KeyChar) <> 8 Then
            If InStr("ABCDEFGHIJKLMNOPQRSTUVWXYZ:\_ ", Char.ToUpper(e.KeyChar)) = 0 Then
                MessageBox.Show("Caracter inválido para una ruta de red.")
                e.Handled = True
            End If
        End If
    End Sub

    Private Sub Txt_Ruta_Servidor_Docs_Validating(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles Txt_Ruta_Servidor_Docs.Validating
        If Txt_Ruta_Servidor_Docs.Text.Trim = "" Then
            MessageBox.Show("Error - Ruta de Servidor no puede quedar vacía")
            e.Cancel = True
        ElseIf Microsoft.VisualBasic.Left(Txt_Ruta_Servidor_Docs.Text, 1) <> "\" _
        Or Microsoft.VisualBasic.Right(Txt_Ruta_Servidor_Docs.Text, 1) <> "\" Then
            MessageBox.Show("Error - NO corresponde a una ruta de red (\\maquina\carpeta_1\carpeta_2\)")
            e.Cancel = True
        End If
    End Sub

    Private Sub Txt_Exped_Entrega_Inmediata_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Txt_Exped_Entrega_Inmediata.KeyPress
        If Asc(e.KeyChar) = Keys.Return Then
            Sendkey.Send("{tab}")
        ElseIf Asc(e.KeyChar) <> 8 Then
            If InStr("ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789", Char.ToUpper(e.KeyChar)) = 0 Then
                MessageBox.Show("Caracter inválido, use letras, dígitos y guión.")
                e.Handled = True
            End If
        End If
    End Sub

    Private Sub Txt_Exped_Entrega_Inmediata_Validating(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles Txt_Exped_Entrega_Inmediata.Validating
        If Txt_Exped_Entrega_Inmediata.Text.Trim = "" Then
            MessageBox.Show("Error - Expedientes de Entrega Inmediata no puede quedar vacío")
            e.Cancel = True
        End If
    End Sub

    Private Sub Txt_Exped_Entrega_Inmediata_LostFocus(sender As Object, e As EventArgs) Handles Txt_Exped_Entrega_Inmediata.LostFocus
        Txt_Exped_Entrega_Inmediata.Text = Txt_Exped_Entrega_Inmediata.Text.ToUpper
        ' agrega las comas delimitadoras
        If Microsoft.VisualBasic.Left(Txt_Exped_Entrega_Inmediata.Text, 1) <> "," Then
            Txt_Exped_Entrega_Inmediata.Text = "," & Txt_Exped_Entrega_Inmediata.Text
        End If
        If Microsoft.VisualBasic.Right(Txt_Exped_Entrega_Inmediata.Text, 1) <> "," Then
            Txt_Exped_Entrega_Inmediata.Text = "," & Txt_Exped_Entrega_Inmediata.Text
        End If
    End Sub

#End Region

#Region "Metodos"

    Sub Despliega()
        NuevaFila = dtParametros.Rows(BindingContext(dtParametros).Position)
        Cmb_ProcuradorGeneral.SelectedValue = NuevaFila.Item("CodigoProcurador")
        Cmb_SubProcuradorGeneral.SelectedValue = NuevaFila.Item("CodigoSubProcurador")
        Txt_Horas_Impresion.Text = NuevaFila.Item("Horas_Impr_Recepcion")
        Txt_Tasa_Anual_Costas.Text = Format(NuevaFila.Item("Tasa_Anual_Costas"), "#0.00")
        Txt_Ruta_Servidor_Docs.Text = NuevaFila.Item("Ruta_Serv_Doc")
        Txt_Exped_Entrega_Inmediata.Text = NuevaFila.Item("Expedientes_Etica")
    End Sub

    Sub Limpiar()
        Cmb_ProcuradorGeneral.SelectedIndex = 0
        Cmb_SubProcuradorGeneral.SelectedIndex = 0
        Txt_Horas_Impresion.Text = ""
        Txt_Tasa_Anual_Costas.Text = ""
        Txt_Ruta_Servidor_Docs.Text = ""
        Txt_Exped_Entrega_Inmediata.Text = ""
    End Sub

#End Region

End Class